/**
 * 用户认证管理
 * 处理登录状态、Token管理、用户信息
 */

const api = require('./api.js')
const request = require('./request.js')

class AuthManager {
  constructor() {
    this.userInfo = null
    this.isLoggedIn = false
    this.init()
  }
  
  /**
   * 初始化认证管理器
   */
  init() {
    // 从本地存储加载用户信息
    this.userInfo = request.getUserInfo()
    this.isLoggedIn = !!request.getToken()
    
    console.log('认证管理器初始化:', {
      isLoggedIn: this.isLoggedIn,
      userInfo: this.userInfo
    })
  }
  
  /**
   * 微信登录
   */
  async wxLogin() {
    try {
      // 获取微信登录code
      const loginRes = await this.getWxLoginCode()
      
      // 获取用户信息（如果用户授权）
      let userProfile = null
      try {
        userProfile = await this.getUserProfile()
      } catch (error) {
        console.log('用户未授权获取个人信息:', error)
      }
      
      // 调用后台登录接口
      const loginData = {
        code: loginRes.code,
        userInfo: userProfile
      }
      
      const result = await api.auth.login(loginData)
      
      if (result.code === 200) {
        // 保存认证信息
        const { token, userInfo, needBind } = result.data
        
        request.setToken(token)
        request.setUserInfo(userInfo)
        
        this.userInfo = userInfo
        this.isLoggedIn = true
        
        return {
          success: true,
          needBind: needBind, // 是否需要绑定身份信息
          userInfo: userInfo
        }
      } else {
        throw new Error(result.message || '登录失败')
      }
    } catch (error) {
      console.error('微信登录失败:', error)
      
      wx.showToast({
        title: error.message || '登录失败',
        icon: 'error'
      })
      
      return {
        success: false,
        error: error.message || '登录失败'
      }
    }
  }
  
  /**
   * 获取微信登录code
   */
  getWxLoginCode() {
    return new Promise((resolve, reject) => {
      wx.login({
        success: resolve,
        fail: reject
      })
    })
  }
  
  /**
   * 获取用户个人信息
   */
  getUserProfile() {
    return new Promise((resolve, reject) => {
      wx.getUserProfile({
        desc: '用于完善用户资料',
        success: resolve,
        fail: reject
      })
    })
  }
  
  /**
   * 绑定用户身份信息
   * @param {Object} identityData - 身份信息
   */
  async bindIdentity(identityData) {
    try {
      const result = await api.auth.bindUserIdentity(identityData)
      
      if (result.code === 200) {
        // 更新本地用户信息
        const updatedUserInfo = {
          ...this.userInfo,
          ...result.data.userInfo,
          isBound: true
        }
        
        request.setUserInfo(updatedUserInfo)
        this.userInfo = updatedUserInfo
        
        return {
          success: true,
          userInfo: updatedUserInfo
        }
      } else {
        throw new Error(result.message || '绑定失败')
      }
    } catch (error) {
      console.error('绑定身份信息失败:', error)
      
      wx.showToast({
        title: error.message || '绑定失败',
        icon: 'error'
      })
      
      return {
        success: false,
        error: error.message || '绑定失败'
      }
    }
  }
  
  /**
   * 更新用户信息
   * @param {Object} userData - 用户数据
   */
  async updateUserInfo(userData) {
    try {
      const result = await api.auth.updateUserInfo(userData)
      
      if (result.code === 200) {
        // 更新本地用户信息
        const updatedUserInfo = {
          ...this.userInfo,
          ...result.data.userInfo
        }
        
        request.setUserInfo(updatedUserInfo)
        this.userInfo = updatedUserInfo
        
        return {
          success: true,
          userInfo: updatedUserInfo
        }
      } else {
        throw new Error(result.message || '更新失败')
      }
    } catch (error) {
      console.error('更新用户信息失败:', error)
      return {
        success: false,
        error: error.message || '更新失败'
      }
    }
  }
  
  /**
   * 刷新用户信息
   */
  async refreshUserInfo() {
    try {
      if (!this.isLoggedIn) {
        return { success: false, error: '用户未登录' }
      }
      
      const result = await api.auth.getUserInfo()
      
      if (result.code === 200) {
        const userInfo = result.data
        request.setUserInfo(userInfo)
        this.userInfo = userInfo
        
        return {
          success: true,
          userInfo: userInfo
        }
      } else {
        throw new Error(result.message || '获取用户信息失败')
      }
    } catch (error) {
      console.error('刷新用户信息失败:', error)
      
      // 如果是认证错误，清除本地数据
      if (error.code === 401) {
        this.logout()
      }
      
      return {
        success: false,
        error: error.message || '获取用户信息失败'
      }
    }
  }
  
  /**
   * 检查登录状态
   */
  checkLoginStatus() {
    const token = request.getToken()
    const userInfo = request.getUserInfo()
    
    this.isLoggedIn = !!token
    this.userInfo = userInfo
    
    return {
      isLoggedIn: this.isLoggedIn,
      userInfo: this.userInfo,
      needBind: userInfo && !userInfo.isBound
    }
  }
  
  /**
   * 要求用户登录
   */
  requireLogin() {
    if (!this.isLoggedIn) {
      wx.showModal({
        title: '需要登录',
        content: '该功能需要登录后使用，是否立即登录？',
        confirmText: '立即登录',
        success: (res) => {
          if (res.confirm) {
            wx.reLaunch({
              url: '/pages/login/login'
            })
          }
        }
      })
      return false
    }
    return true
  }
  
  /**
   * 要求用户绑定身份
   */
  requireBind() {
    if (!this.userInfo || !this.userInfo.isBound) {
      wx.showModal({
        title: '需要身份认证',
        content: '该功能需要完成身份认证，是否立即认证？',
        confirmText: '立即认证',
        success: (res) => {
          if (res.confirm) {
            wx.navigateTo({
              url: '/pages/bind-identity/bind-identity'
            })
          }
        }
      })
      return false
    }
    return true
  }
  
  /**
   * 退出登录
   */
  logout() {
    // 清除本地数据
    request.clearToken()
    
    // 重置状态
    this.userInfo = null
    this.isLoggedIn = false
    
    console.log('用户已退出登录')
    
    // 跳转到登录页
    wx.reLaunch({
      url: '/pages/login/login'
    })
  }
  
  /**
   * 获取用户角色权限
   */
  getUserPermissions() {
    if (!this.userInfo) return []
    
    return this.userInfo.permissions || []
  }
  
  /**
   * 检查用户权限
   * @param {String} permission - 权限名称
   */
  hasPermission(permission) {
    const permissions = this.getUserPermissions()
    return permissions.includes(permission) || permissions.includes('*')
  }
  
  /**
   * 获取用户学校信息
   */
  getSchoolInfo() {
    if (!this.userInfo) return null
    
    return {
      schoolId: this.userInfo.schoolId,
      schoolName: this.userInfo.schoolName,
      classId: this.userInfo.classId,
      className: this.userInfo.className
    }
  }
}

// 创建全局实例
const authManager = new AuthManager()

// 导出认证管理器
module.exports = authManager 